home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGNG_C / CUG187.LZH / FIND-ENV.C < prev    next >
C/C++ Source or Header  |  1985-12-30  |  2KB  |  56 lines

  1. /*@*****************************************************/
  2. /*@                                                    */
  3. /*@ find_env - find the value of a given environmental */
  4. /*@        variable.  Uses DeSmet _lmove() routine.    */
  5. /*@                                                    */
  6. /*@   Usage:     find_env(str);                        */
  7. /*@       where str is the variable name.              */
  8. /*@   Returns a pointer to a COPY of the value of the  */
  9. /*@       given variable name or zero, if not found.   */
  10. /*@   NOTE: the pointer is not to the DOS environ.     */
  11. /*@     but to an area in this program.  If the        */
  12. /*@     DOS environ. area is larger than 256 bytes     */
  13. /*@     and your variable is stored after 256 bytes,   */
  14. /*@     then find_env will not find it.                */
  15. /*@                                                    */
  16. /*@*****************************************************/
  17.  
  18.  
  19. /***********************************************************************/
  20. /*                                                                     */
  21. /*    Find the address of a given environmental variable.                */
  22. /*                                                                     */
  23. /***********************************************************************/
  24.  
  25. char psp[256];            /* dos program segment prefix copy */
  26.  
  27. char *find_env(str)
  28. char *str;
  29. {
  30.     extern unsigned _rax, _rbx;
  31.     int sw, pint;
  32.     char *p, *pp, c;
  33.  
  34.     _rax = 0x62 << 8;        /* Interrupt 62 to get PSP address */
  35.     _doint(0x21);        /* cannot use _os since I need _rbx returned */
  36.     _lmove(sizeof(psp), 0, _rbx, psp, _showds());    /* copy it */
  37.     pint = psp[0x2c] + 256*psp[0x2d];        /* address of envir area */
  38.     _lmove(sizeof(psp), 0, pint, psp, _showds());    /* copy it */
  39.  
  40.     /* now search for matching name */
  41.     p = psp;
  42.     while (*p) {
  43.         sw = 1;        /* match switch */
  44.         pp = str;    /* start of match */
  45.         while ((c = *p++) != '=')
  46.             if (c != toupper(*pp++))    /* all env names are upper */
  47.                 sw = 0;
  48.         if (sw)                    /* did we find a match? */
  49.             return p;        /* yes, give it to the caller */
  50.         else 
  51.             while (*p++)    /* no, skip to next entry */
  52.                 ;
  53.     }
  54.     return 0;            /* name was not found */
  55. }
  56.